#include <bits/stdc++.h>
using namespace std;
int T;
int n,m,L,V;
const int N=100005;
int d[N],a[N],v[N];
int p[N];
struct node{
    int lj;
    int rj;
    int kk;
}G[N],H[N],K[N];
int ans1;
int js,lc;
bool cmp(node a,node b){
    return (a.rj-a.lj+1)<(b.rj-b.lj+1);
}
int ans2;
bool cmp2(node a,node b){
    if(a.lj==b.lj)
        return a.rj<b.rj;
    return a.lj<b.lj;
}
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&T);
    while(T--){
        ans1=0;
        ans2=0;
        js=0;
        lc=0;
        scanf("%d%d%d%d",&n,&m,&L,&V);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&d[i],&v[i],&a[i]);
            G[i].kk=0;
        }
        for(int i=1;i<=m;i++){
            scanf("%d",&p[i]);
        }
        sort(p+1,p+1+m);
        for(int i=1;i<=n;i++){
            if(a[i]==0){
                int le=0;
                for(int j=1;j<=m;j++){
                    if(p[j]>=d[i]){
                        if(v[i]>V){
                            le=j;
                            break;
                        }
                    }
                }
                if(le==0){
                    G[i].kk=1;
                }
                else{
                    G[i].lj=le;
                    G[i].rj=m;
                    H[++js]=node{le,m,0};
                }
                continue;
            }
            if(a[i]>0){
                int le=0;
                for(int j=1;j<=m;j++){
                    if(p[j]>=d[i]){
                        int vt2=2*a[i]*(p[j]-d[i])+v[i]*v[i];
                        if(vt2>V*V){
                            le=j;
                            break;
                        }
                    }
                }
                if(le==0){
                    G[i].kk=1;
                }
                else{
                    G[i].lj=le;
                    G[i].rj=m;
                    H[++js]=node{le,m,0};
                }
                continue;
            }
            int le=0,re=0;
            for(int j=1;j<=m;j++){
                if(p[j]>=d[i]){
                    int vt2=v[i]*v[i]+2*a[i]*(p[j]-d[i]);
                    if(vt2>V*V&&le==0){
                        le=j;
                    }
                    if(vt2>V*V){
                        re=j;
                    }
                    else{
                        break;
                    }
                }
            }
            if(le==0){
                G[i].kk=1;
            }
            else{
                G[i].lj=le;
                G[i].rj=re;
                H[++js]=node{le,re,0};
            }
        }
        for(int i=1;i<=n;i++){
            if(G[i].kk==0){
                ans1++;
            }
        }
        for(int i=1;i<=ans1;i++){
            if(H[i].kk==0){
                K[++lc]=H[i];
                for(int j=i+1;j<=ans1;j++)
                {
                    if(H[j].lj<=H[i].lj&&H[j].rj>=H[i].rj){
                        H[j].kk=1;
                    }
                }
            }
        }
        sort(K+1,K+1+lc,cmp2);
        int i=1;
        while(i<=lc){
            ans2++;
            int j=i+1;
            int sum=K[i].rj;
            for(j=i+1;j<=lc;j++){
                if(K[j].lj<=sum){
                    sum=min(sum,K[j].rj);
                }
                else{
                    break;
                }
            }
            i=j;
        }
        printf("%d %d\n",ans1,n-ans2);
    }
    return 0;
}
